const fs = require('fs');
const path = require('path');

/** 
 * @description 删除目录和该目录下所有文件
 * @param dirPath 目录
 */
async function deleAllFile(dirPath) {
	fs.readdirSync(dirPath).forEach((file, index, arr) => {
		if (fs.lstatSync(`${dirPath}/${file}`).isFile()) {
			fs.unlinkSync(`${dirPath}/${file}`); // 删除文件
		} else if (fs.lstatSync(`${dirPath}/${file}`).isDirectory()) {
			deleAllFile(`${dirPath}/${file}`); // 递归删除子目录及文件
		}
	});
	fs.rmdirSync(dirPath); // 删除空目录
	return;
}


/**
 * @description 解压文件
 * @param path 要解压解压的文件路径
 * @param toPath 解压到目标目录
 * @param fileName 要解压的文件名称
 */
async function decompressionFile(path,toPath) {
	const AdmZip = require('adm-zip');
	const zip = new AdmZip(path);
	const zipEntries = zip.getEntries();
	zip.extractAllTo(toPath, true);
	return;
}


/**
 * @description 没有目录创建目录
 * @param directoryPath 目录路径
 */ 
function haveDirectoryPath(directoryPath) {
	return new Promise((reslove, reject) => {
		fs.exists(directoryPath, (exists) => {
			if (!exists) {
				fs.mkdir(directoryPath, {
					recursive: true
				}, (err) => {
					if (err) throw err;
					reslove()
				});
			} else {
				reslove()
			}
		});
	})
}

/**
 * @description 读取文件
 * @param filePath 目录路径
 */ 
function readFile(filePath) {
	return new Promise((resolve, reject) => {
		fs.readFile(filePath, 'utf8', (err, data) => {
			if (err) {
				resolve({})
			} else {
				resolve(JSON.parse(data));
			}
		});
	});
}

/**
 * @description 读取文件
 * @param data  内容
 * @param filePath 目录路径
 * @return Promice 数据内容变化
 */ 
async function writeFileReturnData(data = {}, filePath = path.resolve(__dirname, "localCache/store/index.json")) {
	let res = await readFile(filePath)
	data = {
		...res,
		...data
	};
	if (typeof data != "string") {
		data = JSON.stringify(data)
	}
	await haveDirectoryPath(path.resolve(__dirname, "localCache"));
	return new Promise((resolve, reject) => {
		fs.writeFile(filePath, data, 'utf8', (err) => {
			if (err) {
				reject(err);
			} else {
				resolve(data);
			}
		});
	});
}


module.exports = {
	deleAllFile,
	decompressionFile,
	writeFileReturnData
}
